from django.db.models import Q
from drf_yasg2.utils import swagger_auto_schema
from rest_framework import viewsets
from drf_yasg2 import openapi
from rest_framework.decorators import action

from PAA_ERP.utils.base_views import MultipleOpenMixin, MultipleDestroyMixin
from PAA_ERP.utils.pagination import GlobalPagination
from basic_info.models import CustomerModel
from basic_info.serializer.customer_serializer import CustomerSerializer


class CustomerView(viewsets.ModelViewSet, MultipleOpenMixin, MultipleDestroyMixin):
    """
    create:
    客户信息--新增

    客户信息新增, status: 201(成功), return: 新增客户信息信息

    destroy:
    客户信息--删除

    客户信息删除, status: 204(成功), return: None

    multiple_delete:
    客户信息--批量删除,必传参数：ids=[1,2,3,4...]

    客户信息批量删除, status: 204(成功), return: None

    multiple_open:
    客户信息--批量启用或者禁用,必传(json)参数：ids=[1,2,3,4...](列表中可以只有一个)，is_open=1/0
    {
        "ids":[1,2],
        "is_open":"0"
    }
    is_open=1表示禁用，is_open=0表示启用，
    客户信息批量启用或者禁用, status: 204(成功), return: None

    update:
    客户信息--修改,

    客户信息修改, status: 200(成功), return: 修改后的客户信息信息

    partial_update:
    客户信息--局部修改,可以传参任意属性的值，服务器会修改指定的属性值 客户信息局部修改,

    status: 200(成功), return: 修改后的客户信息信息

    list:
    客户信息--获取分页列表，可选json参数:name(名称)，mobile(手机号码)，phone(联系电话)
    {
        "name":"长沙",
        "mobile":"186"
    }
    客户信息列表信息, status: 200(成功), return: 客户信息信息列表

    retrieve:
    查询某一个客户信息

    查询指定ID的客户信息, status: 200(成功), return: 用户客户信息
    """
    queryset = CustomerModel.objects.all()
    serializer_class = CustomerSerializer
    pagination_class = GlobalPagination

    def get_queryset(self):
        if self.action == "find":
            # if self.action == "list":
            # 接受三个可能的参数
            name = self.request.data.get("name", None)
            phone = self.request.data.get("phone", None)
            mobile = self.request.data.get("mobile", None)
            # 应为参数可能没有，造成过滤条件是动态的
            query = Q()
            if name:
                # 模糊查询 name like 'keyword%
                query.add(Q(name__contains=name), "AND")  # 多条件组合
            if phone:
                query.add(Q(phone__contains=phone), "AND")  # 多条件组合
            if mobile:
                query.add(Q(mobile__contains=mobile), "AND")  # 多条件组合
            return CustomerModel.objects.filter(query).all()
        else:
            return CustomerModel.objects.all()

    json_params = openapi.Schema(type=openapi.TYPE_OBJECT, properties={
        'name': openapi.Schema(type=openapi.TYPE_STRING, description='客户名字关键字'),
        'phone': openapi.Schema(type=openapi.TYPE_STRING, description='联系电话'),
        'mobile': openapi.Schema(type=openapi.TYPE_STRING, description='手机号码'),
    })
    # 在文档中输入页号页数的接口
    page_param = openapi.Parameter(name='page', in_=openapi.IN_QUERY, description='页号', type=openapi.TYPE_STRING)
    size_param = openapi.Parameter(name='size', in_=openapi.IN_QUERY, description='每页数量', type=openapi.TYPE_STRING)

    @swagger_auto_schema(method='post', request_body=json_params,manual_parameters=[page_param,size_param], operation_description='客户过滤查询')
    @action(methods=['post'], detail=False)
    def find(self, request, *args, **kwargs):
        return super(CustomerView, self).list(request=request, *args, **kwargs)
